package com.cuijiao.emp.java.util;

import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.mchange.v2.c3p0.ComboPooledDataSource;

/**
 * @author cuijiao 数据库连接工具类
 */
public class JDBCUtil {
    public static final String MYSQLDRIVER = "com.mysql.jdbc.Driver";

    public static final String URL = "jdbc:mysql://192.168.1.45:3306/employ";

    public static final String UERNAME = "root";

    public static final String PASSWORD = "udd@123";
    /**
     * 项目启动时，便执行
     */
    static {
        // 1.加载驱动：
        try {
            Class.forName(MYSQLDRIVER);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 项目启动时便已初始化，通过类名可直接调用静态方法
     */
    /**
     * 获取数据库连接对象
     *
     * @return
     */
    public static Connection getConnection() {

        Connection conn = null;

        try {
            conn = DriverManager.getConnection(URL, UERNAME, PASSWORD);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;

    }

    /**
     * 通过C3P0数据库连接池获取连接对象
     *
     * @return
     */
    public static Connection getC3P0Connection() {
        Connection conn = null;
        ComboPooledDataSource ds = new ComboPooledDataSource();

        try { // 1.设置基本属性
            ds.setDriverClass(MYSQLDRIVER);
            ds.setJdbcUrl(URL);
            ds.setUser(UERNAME);
            ds.setPassword(PASSWORD);
            // 2.设置数据库连接池属性
            /**
             * 一般会在xml里配置
             */
            ds.setInitialPoolSize(5);// 初始化连接数
            ds.setMinPoolSize(5);// 最小连接对象个数
            ds.setMaxPoolSize(20);// 最大连接个数
            ds.setAcquireIncrement(3);// conn不够用时，每次增长3个

            conn = ds.getConnection();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (PropertyVetoException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        return conn;
    }

    /**
     * 对于查询操作executeQuery，有结果集的资源释放方法
     *
     * @param conn
     * @param stmt
     * @param rs
     */
    public static void free(Connection conn, Statement stmt, ResultSet rs) {
        // 6.释放资源
        try {
            if (conn != null) {// 连接对象
                conn.close();
                conn = null;
            }
            if (stmt != null) {// 处理对象
                stmt.close();
                stmt = null;
            }
            if (rs != null) {// 结果集
                rs.close();
                rs = null;
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }

    }

    /**
     * 对于数据改动操作executeUpdate，的资源释放方法
     *
     * @param conn
     * @param stmt
     */
    public static void free(Connection conn, Statement stmt) {
        // 6.释放资源
        try {
            if (conn != null) {// 连接对象
                conn.close();
                conn = null;
            }
            if (stmt != null) {// 处理对象
                stmt.close();
                stmt = null;
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
}
